﻿using System;
using System.Data;
using System.Windows.Forms;
using BaseUI;
using Data;
using BL;
using IUI;

namespace WinUI
{
    public partial class AdminForm : //Form
                                     BaseWinForm<AdminPageController>, IAdminPage
    {
        public AdminForm()
        {
            InitializeComponent();
           
            dgVSongs.DataSource = _bsSongs;
            dgVUsers.DataSource = _bsUsers;

            dgVSongs.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader);
            dgVUsers.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader);
        }

        #region Члены IAdminPage
        private EventHandler _click_AddUserButton;
        public EventHandler Click_AddUserButton
        {
            get
            {
                return _click_AddUserButton;
            }
            set
            {
                _click_AddUserButton = value;
            }
        }

        private EventHandler _click_DelUserButton;
        public EventHandler Click_DelUserButton
        {
            get
            {
                return _click_DelUserButton;
            }
            set
            {
                _click_DelUserButton = value;
            }
        }

        private EventHandler _click_EditUserButton;
        public EventHandler Click_EditUserButton
        {
            get
            {
                return _click_EditUserButton;
            }
            set
            {
                _click_EditUserButton = value;
            }
        }

        private EventHandler _click_OkUserButton;
        public EventHandler Click_OkUserButton
        {
            get
            {
                return _click_OkUserButton;
            }
            set
            {
                _click_OkUserButton = value;
            }
        }

        private EventHandler _click_AddSongButton;
        public EventHandler Click_AddSongButton
        {
            get
            {
                return _click_AddSongButton;
            }
            set
            {
                _click_AddSongButton = value;
            }
        }

        private EventHandler _click_DelSongButton;
        public EventHandler Click_DelSongButton
        {
            get
            {
                return _click_DelSongButton;
            }
            set
            {
                _click_DelSongButton = value;
            }
        }

        private EventHandler _click_EditSongsButton;
        public EventHandler Click_EditSongButton
        {
            get
            {
                return _click_EditSongsButton;
            }
            set
            {
                _click_EditSongsButton = value;
            }
        }

        private EventHandler _click_OkSongButton;
        public EventHandler Click_OkSongButton
        {
            get
            {
                return _click_OkSongButton;
            }
            set
            {
                _click_OkSongButton = value;
            }
        }

        public void EnableSongInputs()
        {
            if ("INSERT" != _songs_Command)
            {
                txt_album.Text = dgVSongs.CurrentRow.Cells["album"].Value.ToString();
                txt_artist.Text = dgVSongs.CurrentRow.Cells["artist"].Value.ToString();
                txt_title.Text = dgVSongs.CurrentRow.Cells["title"].Value.ToString();
                txt_ID.Text = dgVSongs.CurrentRow.Cells["id"].Value.ToString();
            }
            else
            {
                txt_ID.Text = Guid.NewGuid().ToString();
            }

            if ("DELETE" != _songs_Command)
            {
                txt_album.Enabled = true;
                txt_artist.Enabled = true;
                txt_title.Enabled = true;
                btn_SongsOk.Enabled = true;
            }

            // выключаем кнопки, чтобы не наделать ерунды
            this.btn_AddSong.Enabled = false;
            this.btn_DelSong.Enabled = false;
            this.btn_EditSong.Enabled = false;
        }

        public void DisableSongInputs()
        {
            if ("INSERT" == _songs_Command)
            {
                // добавляем строку в таблицу
                _bsSongs.AddNew();
                // выставляем текущую строку в гриде
                dgVSongs.CurrentCell = dgVSongs.Rows[dgVSongs.Rows.Count - 1].Cells[1];
            }

            // это чтобы лишний раз не вызывать проверку полей ввода
            DataTable tmp = Current_Song;

            if ("DELETE" != _songs_Command)
            {
                // заносим изменения в грид
                foreach (var column in tmp.Columns)
                {
                    dgVSongs.CurrentRow.Cells[((DataColumn)column).ColumnName].Value
                        = tmp.Rows[0][((DataColumn)column).ColumnName];
                }
            }
            else
            {
                // удаляем строку из грида

                DataGridViewRow row = dgVSongs.CurrentRow;
                dgVSongs.Rows.Remove(row);
            }

            // очищаем и выключаем поля ввода
            txt_album.Clear();
            txt_artist.Clear();
            txt_title.Clear();
            txt_ID.Clear();

            txt_album.Enabled = false;
            txt_artist.Enabled = false;
            txt_title.Enabled = false;
            txt_ID.Enabled = false;

            btn_SongsOk.Enabled = false;

            // включаем кнопки обратно
            this.btn_AddSong.Enabled = true;
            this.btn_DelSong.Enabled = true;
            this.btn_EditSong.Enabled = true;
        }

        private EventHandler _page_Shown;
        public EventHandler Page_Shown
        {
            get
            {
                return _page_Shown;
            }
            set
            {
                _page_Shown = value;
            }
        }
        
        //таблица песен
        public DataTable Songs
        {
            get
            {
                return (DataTable)_bsSongs.DataSource;
            }
            set
            {
                _bsSongs.DataSource = value;
                ((DataTable)_bsSongs.DataSource).AcceptChanges();
            }
        }


        // текущая команда работы с БД
        String _songs_Command = "";
        public String Songs_Command
        {
            get
            {
                return _songs_Command;
            }
            set
            {
                _songs_Command = value/*.ToUpper()*/;
            }
        }

        // временная таблица для внесения изменеий в БД
        public DataTable Current_Song
        {
            get
            {
                if (txt_ID.Text != "")
                {
                    DataSet tmp_ds = new DataSet("ds_" + Song.TableName);
                    DataTable tmp_dt = new DataTable(Song.TableName);

                    tmp_dt = this.Songs.Clone();

                    DataRow row = tmp_dt.Rows.Add();
                    row["artist"] = txt_artist.Text;
                    row["album"] = txt_album.Text;
                    row["title"] = txt_title.Text;
                    row["id"] = txt_ID.Text;

                    tmp_ds.Tables.Add(tmp_dt);

                    return tmp_dt;
                }
                else
                {
                    return null;
                }
            }
        }

        // таблица пользователей
        public DataTable Users
        {
            get
            {
                return (DataTable)_bsUsers.DataSource;
            }
            set
            {
                _bsUsers.DataSource = value;
                ((DataTable)_bsUsers.DataSource).AcceptChanges();
            }
        }

        public DataTable Current_User
        {
            get
            {
                // проверка на всякий случай
                if (chb_IsAdmin.Enabled
                    // проверка на пустоту полей ввода
                    && txt_login.Text != "" && txt_passwd.Text != "")
                {
                    // проверка на уникальность логина
                    foreach (var dg_row in dgVUsers.Rows)
                    {
                        if ( (txt_login.Text == ((DataGridViewRow)dg_row).Cells["id"].Value.ToString()) 
                            && (((DataGridViewRow)dg_row) != dgVUsers.CurrentRow || _users_Command == "INSERT"))
                        {
                            return null;
                        }
                    }

                    DataSet tmp_ds = new DataSet("ds_" + User.TableName);
                    DataTable tmp_dt = new DataTable(User.TableName);

                    tmp_dt = this.Users.Clone();

                    DataRow row = tmp_dt.Rows.Add();
                    row["id"] = txt_login.Text;
                    row["passwd"] = txt_passwd.Text;
                    row["admin"] = chb_IsAdmin.Checked.ToString();

                    tmp_ds.Tables.Add(tmp_dt);

                    return tmp_dt;
                }
                else 
                {
                    return null;
                }
            }
        }

        String _users_Command = "";
        public String Users_Command
        {
            get
            {
                return _users_Command;
            }
            set
            {
                _users_Command = value;
            }
        }

        public void EnableUserInputs()
        {
            if ("INSERT" != _users_Command)
            {
                txt_login.Text = dgVUsers.CurrentRow.Cells["id"].Value.ToString();
                txt_passwd.Text = dgVUsers.CurrentRow.Cells["passwd"].Value.ToString();
                chb_IsAdmin.Checked = ("true" == dgVUsers.CurrentRow.Cells["admin"].Value.ToString() ? true : false);
            }

            if ("DELETE" != _users_Command)
            {
                txt_login.Enabled = true;
                txt_passwd.Enabled = true;
                btn_UsersOk.Enabled = true;
            }
            chb_IsAdmin.Enabled = true;

            // выключаем кнопки, чтобы не наделать ерунды
            this.btn_AddUser.Enabled = false;
            this.btn_DelUser.Enabled = false;
            this.btn_EditUser.Enabled = false;
            
        }

        public void DisableUserInputs()
        {
            if ("INSERT" == _users_Command)
            {
                // добавляем строку в таблицу
                _bsUsers.AddNew();
                // выставляем текущую строку в гриде
                dgVUsers.CurrentCell = dgVUsers.Rows[dgVUsers.Rows.Count - 1].Cells[1];
            }

            // это чтобы лишний раз не вызывать проверку полей ввода
            DataTable tmp = Current_User;

            if ("DELETE" != _users_Command)
            {
                // заносим изменения в грид
                foreach (var column in tmp.Columns)
                {
                    dgVUsers.CurrentRow.Cells[((DataColumn)column).ColumnName].Value
                        = tmp.Rows[0][((DataColumn)column).ColumnName];
                }
            }
            else
            {
                // удаляем строку из грида
                DataGridViewRow row = dgVUsers.CurrentRow;
                dgVUsers.Rows.Remove(row);
            }

            // очищаем и выключаем поля ввода
            txt_login.Clear();
            txt_passwd.Clear();
            chb_IsAdmin.Checked = false;

            txt_login.Enabled = false;
            txt_passwd.Enabled = false;
            chb_IsAdmin.Enabled = false;
            btn_UsersOk.Enabled = false;

            // включаем кнопки обратно
            this.btn_AddUser.Enabled = true;
            this.btn_DelUser.Enabled = true;
            this.btn_EditUser.Enabled = true;
        }

        // показывает ошибку если неправильно заполнены поля ввода на форме
        public void ErrorUser()
        {
            MessageBox.Show("Check Login and Password fields",
                                "Submit to DB error",
                                MessageBoxButtons.OK);
        }
        #endregion

        #region Events of the form
        private void AdminForm_FormClosed(object sender, FormClosedEventArgs e)
        {
            MainForm.Instance.Show();
        }

        private void AdminForm_Shown(object sender, EventArgs e)
        {
            if (_page_Shown != null) _page_Shown(this, null);
        }

        private void btn_EditSong_Click(object sender, EventArgs e)
        {
            if (_click_EditSongsButton != null) _click_EditSongsButton(this, null);
        }

        private void btn_SongsOk_Click(object sender, EventArgs e)
        {
            if (_click_OkSongButton != null) _click_OkSongButton(this, null);
        }

        private void btn_AddSong_Click(object sender, EventArgs e)
        {
            if (_click_AddSongButton != null) _click_AddSongButton(this, null);
        }

        private void btn_DelSong_Click(object sender, EventArgs e)
        {
            if (_click_DelSongButton != null) _click_DelSongButton(this, null);
        }

        private void btn_EditUser_Click(object sender, EventArgs e)
        {
            if (_click_EditUserButton != null) _click_EditUserButton(this, null);
        }

        private void btn_UsersOk_Click(object sender, EventArgs e)
        {
            if (_click_OkUserButton != null) _click_OkUserButton(this, null);
        }

        private void btn_AddUser_Click(object sender, EventArgs e)
        {
            if (_click_AddUserButton != null) _click_AddUserButton(this, null);
        }

        private void btn_DelUser_Click(object sender, EventArgs e)
        {
            if (_click_DelUserButton != null) _click_DelUserButton(this, null);
        } 
        #endregion
    }
}

